/* 
 * File:   main.cpp
 * Author: Garcia Cadavid
 *
 * Created on 10 de septiembre de 2011, 12:48 PM
 */


#include "Interpolacion.h"
#include <cstdlib>
#include <vector>

using namespace std;

int nElementos;
string nombre;
vector<double>x;
vector<double>y,yObt,Alea;
vector<int>x2001,x2004,x2006;
vector<int>y2001,y2004,y2006;
vector<int> xAlea,yAlea;
vector<int>xE,yE;
char *file;



void LecturaArchivo(){
    FILE *archivo;
    char linea [100];
    char *c;
    int cont=0;
    char *marcador="x2001";
    char * valor;
    
    archivo= fopen("datosPractica3.csv","r");
    if(archivo==NULL){
        printf("Error al abrir el archivo");exit(EXIT_FAILURE);
    }
    
    do{
        c=fgets(linea,100,archivo);
        if(cont>=2&&cont<34){
            
            valor = strtok (linea,";");
            while (valor != NULL)
            {
                if(marcador=="x2001"){
                    x2001.push_back(atoi(valor));
                    valor = strtok (NULL, ";");
                    marcador="y2001";
                }
                if(marcador=="y2001"){
                    y2001.push_back(atoi(valor));
                    valor = strtok (NULL, ";");
                    marcador="x2004";
                }
                if(marcador=="x2004"){
                    x2004.push_back(atoi(valor));
                    valor = strtok (NULL, ";");
                    marcador="y2004";
                }if(marcador=="y2004"){
                    y2004.push_back(atoi(valor));
                    valor = strtok (NULL, ";");
                    marcador="x2006";
                }
                if(marcador=="x2006"){
                    x2006.push_back(atoi(valor));
                    valor = strtok (NULL, ";");
                    marcador="y2006";
                }
                if(marcador=="y2006"){
                    y2006.push_back(atoi(valor));
                    valor = strtok (NULL, ";");
                    marcador="x2001";
                }
            }
        }
        
        cont++;
        
    }while(c!=NULL);
    
    fclose(archivo);
}

vector<int> Invertir(vector<int> x)
{
    vector <int> inverso;
    inverso.resize(x.size());
    for(int i=0;i<x.size();i++)
    {
        int pos=x.size()-i-1;
        inverso[i]=x[pos];
    }
    return inverso;
}

void GenerarVector(vector<int>xi,vector<int>yi)
{
    xE.resize(12);
    yE.resize(12);
    for(int i=0;i<32;i++){
        
        if(i<6)
        {
            x[i]=xi[i];
            y[i]=yi[i];
            
        }
        else if((i>=12)&&(i<22))
        {
            x[i-6]=xi[i];
            y[i-6]=yi[i];
        }
        else if(i>27)
        {
            x[i-12]=xi[i];
            y[i-12]=yi[i];
        }
        else{
            xE[i]=xi[i];
            yE[i]=yi[i];
        }
        
    }
}

bool Contiene(vector<int> x, double elem){
    int i=0;
    while(i<x.size()){
        if(x[i]==elem)break;
        else i++;
    }
    return (!(i==x.size()));
}

int main() {
    
    LecturaArchivo();
    GenerarVector(x2001,y2001);
    Interpolacion prueba(x,y);
    cout<<"Error"<<prueba.InterpolacionLagrange(xE,yE,12,12)<<endl;
    yObt.resize(32);
 
    for(int i=0;i<32;i++)
    {
        yObt[i]=prueba.InterpolacionLagrange(x2001,y2001,x2001[i],20);
    }
    nombre="AproximacionLagrange2001.txt";
    file=new char[nombre.length()+1];
    strcpy(file ,nombre.c_str());
    prueba.GenerarArchivo(x2001,yObt,file,32);
    delete file;
    
     for(int i=0;i<32;i++)
    {
        yObt[i]=prueba.InterpolacionLagrange(x2004,y2004,x2004[i],20);
    }
    nombre="AproximacionLagrange2004.txt";
    file=new char[nombre.length()+1];
    strcpy(file ,nombre.c_str());
    prueba.GenerarArchivo(x2004,yObt,file,32);
    delete file;
    
    for(int i=0;i<32;i++)
    {
        yObt[i]=prueba.InterpolacionLagrange(x2006,y2006,x2006[i],20);
    }
    nombre="AproximacionLagrange2006.txt";
    file=new char[nombre.length()+1];
    strcpy(file ,nombre.c_str());
    prueba.GenerarArchivo(x2006,yObt,file,32);
    delete file;
    
    xAlea.resize(40);
    yAlea.resize(40);
    Alea.resize(40);
    xAlea=Invertir(prueba.GeneradorNumerosAleatorios(-10,60,40));
    double y;
    for(int j=0;j<40;j++)
    {
        yAlea[j]=(xAlea[j]^2)+3;
    }
    for(int i=0;i<40;i++)
    {        
        Alea[i]=prueba.InterpolacionLagrange(xAlea,yAlea,xAlea[i],30);
        cout<<" x :"<<xAlea[i]<<" y :"<<yAlea[i]<<" yObt :"<<Alea[i]<<endl;
    }
    
    nombre="AproximacionLagrangeNumerosAleatorios.txt";
    file=new char[nombre.length()+1];
    strcpy(file ,nombre.c_str());
    prueba.GenerarArchivo(xAlea,yObt,file,40);
    delete file;
    
    
    cout<<"error 2001"<<prueba.InterpolacionLagrange(x2001,y2001,32,32)<<endl;
    cout<<"error 2004"<<prueba.InterpolacionLagrange(x2004,y2004,32,32)<<endl; 
    cout<<"error numeros aleatorios "<<prueba.InterpolacionLagrange(xAlea,yAlea,40,40)<<endl;
  
}

